clear
close all
clc
%% Probabilidad de error de una M-PAM
% Parametros de ajuste de la simulacion
%
M = 4;
% cantidad de simbolos
k = log2(M); % bits por simbolo
SNRbdB = 2:14; % SNR por bit en dB
nsimbs = 2e4 ; % cantidad de simbolos que para cada valor de SNRbdB en el Montercarlo
% Conversiones e inicializaciones varias
%
SNRbveces = 10.^(SNRbdB/10); % SNR por bit en veces
SNRdB = SNRbdB + 10*log10(k);
% SNR en dB
SNR = 10.^(SNRdB/10) ;
% SNR en veces
Eavg = 1 ;
Pes = zeros(size(SNRbdB));
Peb = zeros(size(SNRbdB));
% probabilidad de error por simbolo simulada
% probabilidad de error de bit simulada
% P(error) teorica :
%
% Probabilidad de error de bit teorica de una 4−PAM
% Uso un puntero a una funcion cuyo parametro es SNR (en veces)
Pet = @(SNR) 2*(1-1/M) * qfunc(sqrt(3*SNR/(M^2-1))) ;
% Simulacion Montecarlo
%
% Genero un objeto ”modulador PAM” con M = 4 , codigo Gray y la especifico
% por su energia promedio Eavg (definida mas arriba )
modPAM = comm.PAMModulator(M,'SymbolMapping','Gray',... % codifica en Gray
'NormalizationMethod', 'Average Power',...
'AveragePower',Eavg) ; % Energia promedio deseada = 1
% Genero un objeto ”demodulador PAM” con las mismas especificaciones que e l
% modulador
demodPAM = comm.PAMDemodulator(M,'SymbolMapping','Gray',... % codifica en Gray
'NormalizationMethod' , 'Average Power' , ...
'AveragePower',Eavg) ; % Energia promedio deseada
for n0 = 1:length(SNRbdB)
% Primero trabajo con simbolos y despues analizo por bit
%
sigma = sqrt(Eavg/SNR(n0)) ; % desvio de ruido
simbtx = randi(M,nsimbs,1)-1;
% simbolos a t r a n s m i t i r ( en 1 :M) ;
% la funcion ”step” llama al objeto modulador o demodulador
simbmod = step(modPAM,simbtx); % simbolos modulados para su transmision ”OJO , son COMPLEJOS”
% Sumo el ruido (OJO sumo el ruido como si la constelacion tuviera parte compleja )
simbmod = simbmod + sigma * (randn(nsimbs,1) +1i * randn(nsimbs,1)) ;
% Demodulo
simbrx= step(demodPAM,simbmod) ; % simbolos recibidos
% Probabilidad de error de simbolo simulada
Pes(n0) = nnz(simbtx ~= simbrx )/nsimbs ;
% Ahora analizo los errores de bit (el Gray lo hizo el modulador )
%
bitstx = de2bi(simbtx) ; % convierto los simbolos transmitidos a bits
bitsrx = de2bi(simbrx) ; % convierto los simbolos recibidos a bits
% comparo los bits y cuento cuantos difieren
Peb(n0) = nnz(xor(bitstx,bitsrx)) /k/nsimbs ;
end
% Graficos
%
% Probabidad de error de simbolo
figure(1)
semilogy(SNRbdB,Pet(SNR),'-dr','linewidth',1.5);
hold on
semilogy(SNRbdB,Pes,'-o','linewidth',1.5) ;
grid on
box on
xlabel('SNR por bit (dB)') ;
ylabel('Pe')
legend(' Curva teorica','Montecarlo')
% Probabilidad de error por bit
figure(2)
semilogy(SNRbdB,Pet(SNR)/k,'-dr');
hold on
semilogy(SNRbdB,Peb,'-o','linewidth',1.5) ;
grid on
box on
xlabel('SNR por bit (dB)') ;
ylabel('Pb')
legend('Curva teorica','Montecarlo')